<?php

/**
 * login actions.
 *
 * @package    wsaccesos
 * @subpackage login
 * @author     wsaccesos
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class loginActions extends sfActions {

    /**
     * Valida usuario y password para un cliente
     *
     * @WSMethod(name='validate', webservice='wsMegatrans')
     *
     * @param string $username Nombre del usuario
     * @param string $password Password de acceso
     *
     * @return ValidateResponse
     */
    public function executeValidate(sfWebRequest $request) {

        $username = $request->getParameter('username');
        $password = $request->getParameter('password');

        $cliente = Doctrine_Core::getTable('cliente')->findByName(array($username))->getFirst();

        if ($cliente != NULL && $cliente->getPassword() == sha1($password)) {
            $sesionControl = new sesioncontrol();
            $sesionControl->setSesionhash(session_id());
            $sesionControl->setCliente($cliente);
            $sesionControl->save();

            $validateResponse = new ValidateResponse(0, "Usuario validado", $sesionControl->getSesionhash());
            $this->result = $validateResponse;
            return sfView::SUCCESS;
        } else {
            $validateResponse = new ValidateResponse(-1, "Error de validación de usuario", null);
            $this->result = $validateResponse;
            return sfView::ERROR;
        }
    }

    /**
     * Devuelve los vehiculos de un cliente
     *
     * @WSMethod(name='getEmpresas', webservice='wsMegatrans')
     *
     * @param string $hash Identificador del cliente
     *
     * @return GetEmpresasResponse[]
     */
    public function executeGetEmpresas(sfWebRequest $request) {

        $hash = $request->getParameter('hash');

        if ($this->isValidHash($hash)) {
            $hashsesion = Doctrine_Core::getTable('sesioncontrol')->findBySesionhash(array($hash))->getFirst();

            if ($hashsesion->getCliente()->getEmpresa()->count() > 0) {
                $empresas = array();
                foreach ($hashsesion->getCliente()->getEmpresa() as $empresa) {
                    array_push($empresas, new GetEmpresasResponse(
                            0, 'ok', $empresa->getId(), $empresa->toString())
                    );
                }

                $this->result = $empresas;
                return sfView::SUCCESS;
            } else {
                $this->result = array(new GetEmpresasResponse(
                        -1, 'No existen empresas para el cliente', null, null));
                return sfView::ERROR;
            }
        } else {
            $this->result = array(new GetEmpresasResponse(
                    -2, 'Hash inválido', null, null));
            return sfView::ERROR;
        }
    }

    /**
     * Devuelve los vehiculos de un cliente
     *
     * @WSMethod(name='getVehiculos', webservice='wsMegatrans')
     *
     * @param string $hash Identificador del cliente
     * @param integer $empresa_id Identificador de la empresa
     *
     * @return GetVehiculoResponse[]
     */
    public function executeGetVehiculos(sfWebRequest $request) {

        $hash = $request->getParameter('hash');
        $empresa_id = $request->getParameter('empresa_id');

        if ($this->isValidHash($hash)) {

            $empresa = Doctrine_Core::getTable('empresa')->find(array($empresa_id));

            if ($empresa->getVehiculo()->count() > 0) {
                $vehiculos = array();
                foreach ($empresa->getVehiculo() as $vehiculo) {
                    array_push($vehiculos, new GetVehiculoResponse(
                            0, 'ok', $vehiculo->getId(), $vehiculo->toString(), $vehiculo->getPosicion()->getFirst()->getLatitud(), $vehiculo->getPosicion()->getFirst()->getLongitud())
                    );
                }

                $this->result = $vehiculos;
                return sfView::SUCCESS;
            } else {
                $this->result = array(new GetVehiculoResponse(
                        -1, 'No existen vehículos para la empresa', null, null, null, null));
                return sfView::ERROR;
            }
        } else {
            $this->result = array(new GetVehiculoResponse(
                    -2, 'Hash invalido', null, null, null, null));

            return sfView::ERROR;
        }
    }

    /**
     * Modifica el nombre de un vehículo
     *
     * @WSMethod(name='editVehiculo', webservice='wsMegatrans')
     *
     * @param string $hash Identificador del cliente
     * @param integer $id_vehiculo Identificador del vehiculo
     * @param string $nombre Nuevo nombre del vehículo
     *
     * @return EditVehiculoResponse
     */
    public function executeEditVehiculo(sfWebRequest $request) {
        $hash = $request->getParameter('hash');
        $id_vehiculo = $request->getParameter('id_vehiculo');
        $nombre = $request->getParameter('nombre');

        if ($this->isValidHash($hash)) {

            $vehiculo = Doctrine_Core::getTable('vehiculo')->find(array($id_vehiculo));

            if ($vehiculo != null) {
                $vehiculo->setNombre($nombre);
                $vehiculo->save();

                $this->result = new EditVehiculoResponse(0, 'Nombre cambiado correctamente');
                return sfView::SUCCESS;
            } else {
                $this->result = new EditVehiculoResponse(-1, 'Ocurrió un error');
                return sfView::ERROR;
            }
        } else {
            $this->result = new EditVehiculoResponse(-2, 'Hash inválido');
            return sfView::ERROR;
        }
    }

    private function isValidHash($hash) {
        $hashsesion = Doctrine_Core::getTable('sesioncontrol')->findBySesionhash(array($hash))->getFirst();
        return ($hashsesion != null);
    }

}
